package zwp.exercise.service.exercisedemo.chapterThree.basicdatatypes;

import zwp.exercise.service.exercisedemo.chapterThree.constants.CommonConstants;
import zwp.exercise.service.utils.ExecutorUtil;
import zwp.exercise.service.utils.IdleTimeoutUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @Author zwp14
 * @create 2025/9/27 22:04
 * @description 根据身高体重计算BMI指数
 */
public class BMIexponent {
    private static final AtomicLong lastActivityTime = new AtomicLong(System.currentTimeMillis());
    private static int countNum = 0;

    static List<String> list = Arrays.asList("Y","N");


    public static void main(String[] args) {

        ThreadPoolExecutor executor = ExecutorUtil.defaultExecutor();
        int count = 0;

        // 让用户输入自己的身体指标数据
        Scanner scanner = new Scanner(System.in);

        // Q1：声明后未初始化，直接使用会抛出NullPointerException
//        AtomicReference<String> isYes = null;
        AtomicReference<String> isYes = new AtomicReference<>();
        ScheduledExecutorService scheduler = null;
        try {
        //启动空闲操作处理，10s后终止业务
            scheduler = IdleTimeoutUtils.startBusiness(CommonConstants.IDLE_TIMEOUT_MS,lastActivityTime);

            // Q4: 这里不用再创建一个新的线程去执行业务逻辑，直接用主线程执行就好
//        new Thread(()->{

            do {
                // 让用户输入自己的身体指标数据，获取BMI指数
                evaluateBMI(scanner,count);

                System.out.println("是否需要更改数据，再次查看您的BMI指数? 请输出：Y/N，否则将在十秒后关闭系统！");

                // 获取用户输入的指令符
                isYes.set(scanner.next().toUpperCase());
                count++;
                // 用户操作后重置倒计时
                onUserActivity(count);

                // 只允许输入Y/N，否则将在十秒后关闭系统！
                // Q3: 这里比较的是AtomicReference对象而不是其值，
//                boolean contains = list.contains(isYes);



//                Q5：这里一大块都可以简化
//                boolean contains = list.contains(isYes.get());
//                while (!contains){
//                    System.out.println("输入错误，请重新输入：Y/N，否则将在十秒后关闭系统！");
//                    isYes.set(scanner.next().toUpperCase());
//                    // 用户操作后重置倒计时
//                    onUserActivity();
//                    contains = list.contains(isYes);
//                }


                //Q5Answer：
                String userInput = getUserInput(isYes);
                isYes.set(userInput);
            } while (CommonConstants.YES.equalsIgnoreCase(isYes.get()));
        } finally {
            scanner.close();
            scheduler.shutdown();
        }


//        }).start();

        //Q2：主线程立即调用了interrupt，这将会导致程序异常终止
//        Thread.currentThread().interrupt();
        // 十秒后系统自动关闭
    }

    private static String getUserInput(AtomicReference<String> isYes) {
        while (true){
            if (list.contains(isYes.get())){
                return isYes.get();
            }
        }
    }

    /**
     * 用户操作后重置倒计时
     */
    private static void onUserActivity(int count) {
        lastActivityTime.set(System.currentTimeMillis());
        System.out.println("检测到用户操作，重置计时器,第" + count + "次");
    }

    /**
     * 让用户输入自己的身体指标数据，获取BMI指数
     * @return 控制台输入scanner
     */
    private static void evaluateBMI(Scanner scanner,int count) {
        System.out.println("请输入您的身高(cm)：");
        double height = scanner.nextDouble()/100;
        count++;
        // 用户操作后重置倒计时
        onUserActivity(count);
        System.out.println("请输入您的体重(kg)：");
        int weight = scanner.nextInt();
        count++;
        // 用户操作后重置倒计时
        onUserActivity(count);
        // 计算BMI指数
        double exponent = weight/(height*height);
        System.out.println("您的身高为："+height*100 + "cm");
        System.out.println("您的体重为："+weight + "kg");
        System.out.println("您的BMI指数为："+exponent);

        // 最终评价
        fetchFinalEvaluation(exponent);
    }

    public static void fetchFinalEvaluation(double exponent) {
        String finalEvaluation = "error: “输入指标数据不合法。”";
        if (exponent < CommonConstants.THIN_CONSTANT){
            finalEvaluation = "体重过轻";
        }
        if (exponent >= CommonConstants.THIN_CONSTANT && exponent < CommonConstants.COMMON_CONSTANT){
            finalEvaluation = "正常范围";
            countNum = 1;
        }
        if (exponent >= CommonConstants.COMMON_CONSTANT && exponent < CommonConstants.FAT_CONSTANT){
            finalEvaluation = "体重过重";
            countNum = 2;
        }
        if (exponent >= CommonConstants.FAT_CONSTANT){
            finalEvaluation = "肥胖";
            countNum = 3;
        }
        System.out.println("您的体重属于：" + finalEvaluation);

        switch (countNum){
            case 1:
                System.out.println("继续保持哦！");
                break;
            case 2:
                System.out.println("平时需要少吃点油炸食品了哦！");
                break;
            case 3:
                System.out.println("为了您的健康，您不能再胖了了，请不要再过度饮食！");
                break;
            default:
                System.out.println("为了您的健康，请吃点好的！增加下体重！");
        }
    }
}
